package org.liang.code.utils.excel;

import org.apache.poi.ooxml.POIXMLProperties;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.util.Date;
import java.util.Optional;

public class ExcelUtils {

    /**
     * 设置标题格式
     * @param workbook Workbook
     * @return CellStyle
     */
    public static CellStyle headerStyle(Workbook workbook){
        CellStyle headerStyle = workbook.createCellStyle();
        headerStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());
        headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        Font headerFont = workbook.createFont();
        headerFont.setBold(true);
        headerFont.setFontHeightInPoints((short) 12);
        headerStyle.setFont(headerFont);
        return headerStyle;
    }

    /**
     * 填充数据
     * @param data 被填充的数据
     * @param row 哪一行
     * @param cellStyle 单元格格式
     */
    public static void writeCell(String[] data, Row row, CellStyle cellStyle){
        for (int i = 0; i < data.length; i++) {
            Cell cell = row.createCell(i);
            cell.setCellValue(data[i]);
            cell.setCellStyle(cellStyle);
        }
    }

    /**
     * 填充数据
     * @param data 被填充的数据
     * @param row 哪一行
     */
    public static void writeCell(String[] data, Row row){
        for (int i = 0; i < data.length; i++) {
            Cell cell = row.createCell(i);
            cell.setCellValue(data[i]);
        }
    }

    /**
     * 合并单元格
     * @param startRow 开始行
     * @param endRow 结束行
     * @param startCol 开始列
     * @param endCol 结束列
     * @return Sheet
     */
    public static Sheet cellAddresses(Sheet sheet, int startRow, int endRow, int startCol, int endCol) {
        CellRangeAddress cellAddresses = new CellRangeAddress(startRow, endRow, startCol, endCol);
        sheet.addMergedRegion(cellAddresses);
        return sheet;
    }

    /**
     * 添加下拉框校验
     * @param data 下拉框数据
     * @param sheet 页
     * @param startRow 开始行
     * @param endRow 结束行
     * @param startCol 开始列
     * @param endCol 结束列
     * @return Sheet
     */
    public static Sheet dropdownBox(String[] data, Sheet sheet, int startRow, int endRow, int startCol, int endCol){
        // 获取数据验证帮助对象
        DataValidationHelper validationHelper = sheet.getDataValidationHelper();
        // 创建约束
        DataValidationConstraint constraint = validationHelper.createExplicitListConstraint(data);
        // 设置数据验证区域
        CellRangeAddressList addressList = new CellRangeAddressList(startRow, endRow, startCol, endCol);
        // 创建数据验证
        DataValidation validation = validationHelper.createValidation(constraint, addressList);
        // 防止输入非下拉列表中的值
        validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
        validation.setShowErrorBox(true);
        validation.createErrorBox("错误", "请从下拉列表中选择部门");
        // 添加到工作表
        sheet.addValidationData(validation);
        return sheet;
    }

    public static void metaData(XSSFWorkbook workbook){
        POIXMLProperties.CoreProperties coreProps = workbook.getProperties().getCoreProperties();

        // 设置核心属性
        coreProps.setTitle("2023年度销售报告");          // 文档标题
        coreProps.setDescription("包含2023年各季度销售数据及分析"); // 文档说明
        coreProps.setKeywords("销售, 2023, 数据分析");   // 关键词
        coreProps.setCategory("财务报告");               // 分类
        coreProps.setCreator("张三");                    // 创建者(作者)
        coreProps.setCreated(Optional.of(new Date()));                // 创建时间

        POIXMLProperties.ExtendedProperties extProps = workbook.getProperties().getExtendedProperties();

        // 设置扩展属性
        extProps.setApplication("Apache POI生成");       // 应用程序名称
        extProps.setAppVersion("1.0");                  // 应用程序版本
        extProps.setCompany("ABC科技有限公司");          // 公司名称
        extProps.setManager("李四");                     // 管理者
        extProps.setTemplate("销售报告模板");            // 模板信息

        POIXMLProperties.CustomProperties customProps = workbook.getProperties().getCustomProperties();

        // 添加自定义属性
        customProps.addProperty("来源", "ERP系统导出数据");       // 文本类型
        customProps.addProperty("数据版本", 2.5);               // 浮点数类型
        customProps.addProperty("是否审核", true);               // 布尔类型
        customProps.addProperty("审核日期", String.valueOf(new Date()));         // 日期类型
        customProps.addProperty("联系人", "王五");               // 文本类型
        customProps.addProperty("联系电话", "13800138000");      // 文本类型
    }
}
